package main.java.leetcode.简单;

import org.junit.Test;

public class leetcode566_重塑矩阵 {


    @Test
    public void test(){
        int[][] ints = new int[][]{{1,2,3,4,5,6,7,8},{9,10,11,12,13,14,15,16},{17,18,19,20,21,22,23,24}};
        int[][] ints1 = matrixReshapePublic(ints, 1, 24);
        for (int[] intt:ints1){
            for (int i:intt){
                System.out.print(i+" ");
            }
            System.out.println();
        }
    }

    public int[][] matrixReshape(int[][] mat, int r, int c) {
        int[][] result = new int[r][c];
        int left = 0;
        int ci = 0;
        if (r * c != mat.length*mat[0].length) {
            return mat;
        }
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[i].length; j++) {


                if (ci == c) {
                    ci = 0;
                    left += 1;
                }
                result[left][ci] = mat[i][j];
                ci++;
            }
        }
        return result;
    }


    /**
     * 行数m, 列数n 元素(i,j)
     * 公式化 官解
     * [i,j] - > i*n+j
     * i = x/n
     * j = x%n
     * 设 nums 本身为 mm 行 nn 列，如果 mn \neq rcm !=rc，那么二者包含的元素个数不相同，因此无法进行重塑；
     *
     * 否则，对于 x \in [0, mn)x∈[0,mn)，第 xx 个元素在 nums 中对应的下标为 (x / n, x%n)(x/n,x%n)，
     * 而在新的重塑矩阵中对应的下标为 (x / c, x%c)(x/c,x%c)。我们直接进行赋值即可。
     */
    public int[][] matrixReshapePublic(int[][] mat, int r, int c){
        int n = mat[0].length;
        int m = mat.length;

        if(n*m != r*c){
            return mat;
        }
        int[][] ans = new int[r][c];
        for (int i = 0;i<m*n;i++){
            ans[i/c][i%c] = mat[i/n][i%n];
        }
        return ans;
    }
}
